package com.sh.datasync.controller;

import com.sh.datasync.model.PlmFileData;
import com.sh.datasync.util.PlmFileScanner;
import org.springframework.web.bind.annotation.*;
import java.util.*;
import java.io.File;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;

@RestController
@RequestMapping("/api/plmfile")
public class PlmFileDataController {
    /**
     * 获取日志文件列表，包含文件名和最后修改时间，按时间倒序排列
     * @return 日志文件信息列表，每项包含 name（文件名）和 lastModified（最后修改时间，毫秒）
     */
    @GetMapping("/logfiles")
    public List<Map<String, Object>> logFiles() {
        File dir = new File("D:/Eplan_integration/PLM2EPLAN/logs");
        File[] files = dir.listFiles((d, name) -> name.toLowerCase().endsWith(".log"));
        List<Map<String, Object>> fileList = new ArrayList<>();
        if (files != null) {
            for (File f : files) {
                Map<String, Object> map = new HashMap<>();
                map.put("name", f.getName());
                map.put("lastModified", f.lastModified());
                fileList.add(map);
            }
            // 按最后修改时间倒序排序
            fileList.sort((a, b) -> Long.compare((Long)b.get("lastModified"), (Long)a.get("lastModified")));
        }
        return fileList;
    }

    @GetMapping("/logfile")
    public List<String> logFile(@RequestParam String name) throws IOException {
        File file = new File("D:/Eplan_integration/PLM2EPLAN/logs", name);
        List<String> lines = new ArrayList<>();
        if (file.exists()) {
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    lines.add(line);
                }
            }
        }
        return lines;
    }

    /**
     * 获取所有日志文件的合并内容，使用XML文件修改时间并按时间倒序排列
     * @return 所有日志条目的列表，最新的在最前面
     */
    @GetMapping("/alllogs")
    public List<String> allLogs() throws IOException {
        File logsDir = new File("D:/Eplan_integration/PLM2EPLAN/logs");
        File[] logFiles = logsDir.listFiles((d, name) -> name.toLowerCase().endsWith(".log"));
        List<String> allLines = new ArrayList<>();
        
        if (logFiles != null) {
            for (File logFile : logFiles) {
                try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(logFile), "UTF-8"))) {
                    String line;
                    while ((line = reader.readLine()) != null) {
                        // 解析日志行，替换最后的时间字段
                        String updatedLine = updateLineWithXmlFileTime(line, logFile.getName());
                        allLines.add(updatedLine);
                    }
                } catch (IOException e) {
                    // 跳过无法读取的文件，继续处理其他文件
                    continue;
                }
            }
        }
        
        // 按XML文件修改时间（最后一个字段）倒序排序
        allLines.sort((line1, line2) -> {
            try {
                String[] parts1 = line1.split("\\|");
                String[] parts2 = line2.split("\\|");
                if (parts1.length > 11 && parts2.length > 11) {
                    String time1 = parts1[11];  // XML文件修改时间
                    String time2 = parts2[11];
                    
                    // 解析日期进行比较，而不是字符串比较
                    Date date1 = parseDate(time1);
                    Date date2 = parseDate(time2);
                    
                    if (date1 != null && date2 != null) {
                        // 倒序排列，最新的在前面
                        return date2.compareTo(date1);
                    } else {
                        // 如果日期解析失败，使用字符串比较
                        return time2.compareTo(time1);
                    }
                }
            } catch (Exception e) {
                // 如果解析失败，保持原顺序
            }
            return 0;
        });
        
        return allLines;
    }
    
    /**
     * 根据日志文件名找到对应的XML文件，并用XML文件的修改时间替换日志中的时间字段
     */
    private String updateLineWithXmlFileTime(String line, String logFileName) {
        try {
            String[] parts = line.split("\\|");
            if (parts.length < 12) {
                return line; // 如果格式不正确，返回原行
            }
            
            // 从日志文件名中提取文件夹类型和XML文件名
            // 日志文件名格式: backup_filename.xml.log 或 error_filename.xml.log
            String xmlFileName;
            String folderType;
            
            if (logFileName.startsWith("backup_")) {
                folderType = "backup";
                xmlFileName = logFileName.substring(7, logFileName.length() - 4); // 去掉 "backup_" 前缀和 ".log" 后缀
            } else if (logFileName.startsWith("error_")) {
                folderType = "error";
                xmlFileName = logFileName.substring(6, logFileName.length() - 4); // 去掉 "error_" 前缀和 ".log" 后缀
            } else {
                return line; // 如果文件名格式不符合预期，返回原行
            }
            
            // 构建XML文件路径
            String xmlFilePath = "D:/Eplan_integration/PLM2EPLAN/" + folderType + "/" + xmlFileName;
            File xmlFile = new File(xmlFilePath);
            
            // 如果XML文件存在，使用其修改时间
            if (xmlFile.exists()) {
                Date xmlModTime = new Date(xmlFile.lastModified());
                parts[11] = xmlModTime.toString(); // 替换最后一个字段（时间字段）
                return String.join("|", parts);
            }
            
        } catch (Exception e) {
            // 如果处理失败，返回原行
        }
        
        return line; // 默认返回原行
    }
    
    /**
     * 解析日期字符串，支持多种日期格式
     */
    private Date parseDate(String dateStr) {
        if (dateStr == null || dateStr.trim().isEmpty()) {
            return null;
        }
        
        // 常见的日期格式列表
        String[] patterns = {
            "EEE MMM dd HH:mm:ss zzz yyyy",  // 标准Java Date.toString()格式
            "yyyy-MM-dd HH:mm:ss",           // 标准日期时间格式
            "yyyy-MM-dd",                    // 日期格式
            "MM/dd/yyyy HH:mm:ss",           // 美式日期时间格式
            "dd/MM/yyyy HH:mm:ss"            // 欧式日期时间格式
        };
        
        for (String pattern : patterns) {
            try {
                SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.ENGLISH);
                return sdf.parse(dateStr.trim());
            } catch (ParseException e) {
                // 继续尝试下一个格式
            }
        }
        
        return null; // 所有格式都解析失败
    }
}
